/*
 * @Description: 初始化类型定义，最好不要更改
 * @Author: HuiSir<https://gitee.com/huisir001>
 * @Date: 2025-08-11 17:30:53
 * @LastEditTime: 2025-08-26 10:19:09
 */

/* eslint-disable @typescript-eslint/no-explicit-any */

export interface StorageItem {
  /**
   * 缓存的key
   */
  key: string;
  /**
   * 缓存位置 sessionStorage | localStorage
   */
  type: "localStorage" | "sessionStorage";
}

/**
 * 项目配置项类型定义（针对根目录配置文件project-config.yaml）
 */
export interface ProjectConfig {
  /**
   * 网站标题
   */
  siteTitle: string;

  /**
   * 开发调试代理（这里配置省的改vite.config.ts）,不使用代理则为空对象
   */
  devServerProxy: Recordable<string>;

  /**
   * 请求字段名映射
   */
  requestFields: {
    /**
     * 当前页码
     */
    pageNo: string;
    /**
     * 每页条数
     */
    pageSize: string;
    /**
     * 其他
     */
    [key: string]: any;
  };

  /**
   * 请求结果字段名映射
   */
  responseFields: {
    /**
     * 状态码
     */
    code: string;
    /**
     * 消息提示
     */
    message: string;
    /**
     * 具体数据
     */
    data: string;
    /**
     * 其他
     */
    [key: string]: any;
  };

  /**
   * 请求结果data对象下属字段名映射
   */

  responseDataSubFields: {
    /**
     * 分页记录数组（在data对象中）
     */
    records: string;
    /**
     * 总条数
     */
    total: string;
    /**
     * 其他
     */
    [key: string]: any;
  };

  /**
   * 请求返回值基础状态码映射
   */
  responseBaseCode: {
    /**
     * 请求成功
     */
    success: string;
    /**
     * 登陆失效
     */
    loginInvalid: string;
  };

  /**
   * 请求错误提示消息（接口响应的状态码，非http错误码）
   */
  responseErrMsg: Recordable<string>;

  /**
   * 权限字段映射
   */
  permissionFields: Recordable<string>;

  /**
   * 树结构默认数据
   */
  defaultTreeData: {
    /**
     * 父ID字段
     */
    parentIdField: string;
    /**
     * 子项字段
     */
    childrenField: string;
    /**
     * 祖先（顶层）id值
     */
    ancestorId: string;
  };

  /**
   * 角色字段映射
   */
  roleFields: Recordable<string>;

  /**
   * 登录请求字段映射
   */
  loginFields: {
    /**
     * 账号
     */
    accountNo: string;
    /**
     * 密码
     */
    password: string;
    /**
     * 图形验证码ID
     */
    verifyId: string;
    /**
     * 图形验证码code
     */
    verifyCode: string;
    /**
     * 其他
     */
    [key: string]: any;
  };

  /**
   * token令牌请求传参配置
   */
  token: {
    /**
     * 键名(请求头、响应头)，注意：请求头对象的键名都是小写
     */
    key: string;
    /**
     * 前置字符(请求头传参拼接)
     */
    prefix: string;
    /**
     * 后置字符(请求头传参拼接)
     */
    suffix: string;
  };

  /**
   * Storage缓存配置
   */
  storage: Record<"token" | "theme", StorageItem>;

  theme: Array<{
    /**
     * 主题编码
     */
    name: string;
    /**
     * 是否默认
     */
    default?: boolean;
    /**
     * 展示颜色
     */
    color: string;
    /**
     * 样式文件
     */
    file: string;
  }>;

  /**
   * 外部依赖js资源
   * 将`vue/vue-router/element-plus/vuex`等插件直接使用cdn引入
   * 需要配置`vite.config`中的`rollupOptions`，将不需要打包的库排除，且给CDN导入的外部包一个全局变量
   * 注意1：`vue-router/element-plus/vuex`等库须依赖vue库，所以vue需要在前面
   * 注意2：外链cdn注意版本问题，需与`package.json`中的包版本一致
   */
  scriptResources: Array<{
    /**
     * 外部化处理不想打包进库的依赖
     */

    dependence: string;
    /**
     * 外部cdn链接
     */

    src: string;
    /**
     * cdn包取代依赖项的全局变量
     */

    globalVar: string;
  }>;

  /**
   * CSS CDN Resources
   * 这里会将其直接注入html
   * 注意：版本号及时调整
   */
  styleResources: string[];
}
